//
//  Status.swift
//  TWeibo
//
//  Created by wtw on 15/8/3.
//  Copyright © 2015年 wtw. All rights reserved.
//

import UIKit
import SDWebImage

class Status: NSObject {

    /// 微博创建时间
    var created_at: String?
    /// 微博ID
    var id: Int = 0
    /// 微博信息内容
    var text: String?
    /// 微博来源
    var source: String?
    /// 配图数组
    var pic_urls: [[String: AnyObject]]? {
        didSet {
        //判断数组中是否有数据
            if pic_urls?.count == 0 {
            return
            }
            //实例化数组
            storePictureURl = [NSURL]()
            
            //遍历字典生成 url 的数组
            for dict in pic_urls! {
                if let urlString = dict["thumbnail_pic"] as? String {
                storePictureURl!.append(NSURL(string: urlString)!)
                }
            }
        }
    }
     /// 配图的URL数组 ,计算型属性，根据是否转发微博返回不同的url
    var pictureURLs: [NSURL]? {
        return retweeted_status == nil ? storePictureURl : retweeted_status?.storePictureURl
    }
    
    //配图的 URL  ’存储‘数据
    private var storePictureURl: [NSURL]?
    
    ///显示微博所需要的行高 （利用微博模型来计算行高）
    var rowHeight: CGFloat?
    /// 用户
    var user: User?
    
    //转发问微博
    var retweeted_status: Status?
    
    // MARK: - 加载微博数据，返回微博数据的数组
    class func loadStatus(since_id:Int,max_id: Int,finished: (dataList: [Status]?, error: NSError?) -> ()) {
        
        NetworkTools.shareNetworkTools.loadStatuses(since_id,max_id: max_id) { (result, error) -> () in
            
            if error != nil {
                finished(dataList: nil, error: error)
                return
            }
            
            /// 判断能否获得字典数组，然后字典转模型
            if let array = result?["statuses"] as? [[String: AnyObject]] {
                // 遍历数组，字典转模型
                var list = [Status]()
                
                for dict in array {
                    list.append(Status(dict: dict))
                }
                
                //缓存图片 self ,是本类只有一个
                //图片的缓存结束后，在进行回调
                self.cacheStatusPictures(list, finished: finished)
                
//                // 获得完整的微博数组，可以回调
//                finished(dataList: list, error: nil)
            } else {
                finished(dataList: nil, error: nil)
            }
        }
    }
    
    //图片先缓存到本地,再设置大小
    private class func cacheStatusPictures(statuses: [Status],finished: (dataList: [Status]?,error: NSError?) ->()) {
        var datalenth = 0
        //缓存结束之后才刷新数据，创建调度组
        let group = dispatch_group_create()
        //循环遍历数组
        for s in statuses {
            //判断是否有图片，如果为空continue
            guard let urls = s.pictureURLs else{
                continue
            }
            //遍历 urls 的数组，缓存图片
            for imageurl in urls {
                //进入调度组
                dispatch_group_enter(group)
                //progress 进度回调
                SDWebImageManager.sharedManager().downloadImageWithURL(imageurl, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, _, _, _, _) -> Void in
                    //图像转换成二进制的数据
                    datalenth += UIImagePNGRepresentation(image)!.length
                    dispatch_group_leave(group)
                })
            }
        }
        //监听所有缓存的通知
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            //因为返回的都是缩略图，图像不大，不影响用户的体验
            print("预加载图片的大小 \(datalenth / 1024)K")
            finished(dataList: statuses, error: nil)
        }
    }
    
    //MARK: - 构造函数
    init(dict:[String: AnyObject]) {
        super.init()
        //会调用setValue forKey 给每一个属性赋值
        setValuesForKeysWithDictionary(dict)
    }
    //重写的上面的方法（因为user）
    override func setValue(value: AnyObject?, forKey key: String) {
        //判断 key 是否是 user,如果是user 单独处理
        if key == "user" {
        //判断 value 是否是一个有效的字典
            if let dict = value as? [String: AnyObject] {
                //创建用户数据
                user = User(dict:dict)
            }
            return
        }
        
        //判断 key 是否是retweeted_status（转发微博）
        if key == "retweeted_status" {
            if let dict = value as? [String:AnyObject] {
                //创建转发微博的数据
                retweeted_status = Status(dict: dict)
            }
            return
        }
        
        super.setValue(value, forKey: key)
    }
    override func setValue(value: AnyObject?, forUndefinedKey key: String) { }
    
    //以详细信息的样式显示字符串
    override var description: String {
        let keys = ["created_at", "id", "text", "source", "pic_urls"]
        
        return "\(dictionaryWithValuesForKeys(keys))"
    }

}
